#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include<QUdpSocket>
#include<QDebug>
#include<QTcpSocket>
#include<QMetaEnum>
#include <QTimer>
#include "message.h"


QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

/**
 * @brief UDP 实现组播的接收方
 * @note 组播使用单个发送者向一个预定义的组播地址发送数据报，
 * 而接收者需要加入到该组播地址才能接收到数据。
 * 组播地址是一个特殊的 IPv4 或 IPv6 地址范围，
 * 例如 IPv4 的组播地址范围是 224.0.0.0 到 239.255.255.255。
 * 在组播中，发送者和接收者通过共享相同的组播地址进行通信。
 *  组播接收者应绑定 Socket 到指定的端口 并且加入到指定的组播组才能收到数据。
 *  发送数据报到指定的组播地址和端口（如果是发送者）。
 *
 */
class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();


private slots:
    /**
     * @brief 显示消息
     * @param info
     */
    void showMessage(const QString &info);

    /**
     * @brief 发送消息
     */
    void on_btnSend_clicked();

    /**
     * @brief 数据到来的信号
     */
    void  slotReadyRead();

    /**
     * @brief 出错
     */
    void slotError(QAbstractSocket::SocketError);

    /**
     * @brief 加入组播或离开组播
     */
    void on_btnMultica_clicked();

private:
    Ui::Widget *ui;
    QUdpSocket  m_udp;
    bool m_join = false; //已经加入
    bool m_bind = false;
};
#endif // MAINWINDOW_H
